參考文件:
教學開始
在自己的model引入AASM1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class Job
  include AASM
  aasm do
    state :sleeping, :initial => true
    state :running, :cleaning
    event :run do
      transitions :from => :sleeping, :to => :running
    end
    event :clean do
      transitions :from => :running, :to => :cleaning
    end
    event :sleep do
      transitions :from => [:running, :cleaning], :to => :sleeping
    end
  end
end
state統整所有可能的狀態-initial為初始狀態event各個事件method名稱transitions從(from)什麼狀態改為(to)什麼狀態
此時我們在rails console也有了下面的methods可以呼叫1
2
3
4
5
6
7
8job = Job.new
job.sleeping? # => true
job.may_run?  # => true
job.run
job.running?  # => true
job.sleeping? # => false
job.may_run?  # => false
job.run       # => raises AASM::InvalidTransition
這時候在controller裡面可以呼叫1
2
3…
    @job.run!
...
執行結果:job.aasm_state從原本的"sleeping"更新為"running"
注意:
1.transitions from可以是一個陣列,但如果呼叫了此event但值不包含在from裡面則會報錯!
ex:
在job.aasm_state還是sleeping的時候執行@job.clean!
2.aasm do預設執會去找aasm_state這個欄位,如要設定哪個欄位請使用aasm(xxx) do
ex:
想要他去偵測一個location欄位需要寫成aasm(:location) do
3.我們可以宣告多個欄位,但有重複的event後面的會覆蓋到前面的event,請善用namespace!
ex:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28class NamespacedMultipleExample
  include AASM
  aasm(:status) do
    state :unapproved, :initial => true
    state :approved
    event :approve do
      transitions :from => :unapproved, :to => :approved
    end
    event :unapprove do
      transitions :from => :approved, :to => :unapproved
    end
  end
  aasm(:review_status, namespace: :review) do
    state :unapproved, :initial => true
    state :approved
    event :approve do
      transitions :from => :unapproved, :to => :approved
    end
    event :unapprove do
      transitions :from => :approved, :to => :unapproved
    end
  end
end
在rails console呼叫:1
2
3
4
5
6
7
8
9namespaced = NamespacedMultipleExample.new
namespaced.aasm(:status).current_state
# => :unapproved
namespaced.aasm(:review_status).current_state
# => :unapproved
namespaced.approve_review
namespaced.aasm(:review_status).current_state
# => :approved
以上我認為已經很夠用,如果想了解更多再去翻文件吧!
官方文件